Introducción
- Para este análisis se descargó multiples archivos excel de veritrade relacionados a exportaciones de madera.
- Queremos determinar las partidas arancelarias que mueven más dinero en las exportacioens de madera desde Perú.
- Se eliminaron las partidas arancelarias relacionadas al cobre y otras que no correspondían a madera.
Lista de cambios/correciones
- Nos quedamos con todas las que empiezan con el código “44xxxxxx” y además con partidas arancelarias de otro código pero asociadas a madera que se encontraban entre las primeras 50 del ranking anterior.
- Se agregó evolución de las exportaciones de madera por país de destino
#Importando data veritrade
exp_madera <-
list.files(path = "~/r_projects/chompiras/data partidas arancelarias/exportaciones",
pattern = "*.xlsx",
full.names = T) %>%
map_df(~read_excel(.,skip = 5, col_types = c("text","text","text","text","date","text","text","text","numeric","numeric","numeric","text","numeric","text","numeric","numeric","numeric","text","text","text","text","text","text","text","text","text","text","text","text","text","text","text"))) %>%
as_tibble() %>%
separate(
Fecha, into =c('anio','mes','dia')
) %>%
filter(str_detect(`Partida Aduanera`,"^44|9403600000|9403500000|9401610000|9401690000|9403300000")) %>%
distinct()
Ranking partidas arancelarias
Evolución por año de las partidas arancelarias asociadas a madera
[1] -0.04767123
Evolución por año de las empresas exportadoras con todas las partidas incluidas asociadas a Madera.
[1] -0.03972603
Países de destino de la madera
[1] -0.03972603
Comparación nomenclaturas partidas arancelarias
- En esta tabla se comparan la descripción de los códigos de las partidas arancelarias para cada base de datos.
- Luego del cruce se pudo establecer que hay al menos xx partidas arancelarias que ya no están vigentes, pero que figuran en la data de veritrade.
- Hay un caso interesante con la partida “4412320000”. Desde el 2018 ya no se registran exportaciones con este código. ¿A qué código cambiaron para registrar sus exportaciones?
exp_madera %>%
dplyr::group_by(`Partida Aduanera`, `Descripcion de la Partida Aduanera`) %>%
summarise(
valor_fob = sum(`U$ FOB Tot`,na.rm = T)
) %>%
ungroup() %>%
arrange(desc(valor_fob)) %>%
rename(descripcion_veritrade = `Descripcion de la Partida Aduanera`) %>%
left_join(partidas_sunat %>%
select(-`Nro Partida`,-`descargado veritrade`) %>%
rename(`Partida Aduanera` = `Nro Partida 2`) %>%
distinct(), by = "Partida Aduanera" ) %>%
rename(descripcion_sunat = `Descripción de Partida`) %>%
relocate(`Partida Aduanera`,descripcion_veritrade, descripcion_sunat, valor_fob) %>%
DT::datatable(colnames = c("Partida aduanera","Descripcion veritrade","Descripción Sunat","Valor FOB (US$)")) %>%
DT::formatRound(columns = 4:4 ,digits = 0, mark = ".",dec.mark = ",")
Código para ver compilado final de partidas aduaneras.
exp_madera %>%
dplyr::group_by(`Partida Aduanera`, `Descripcion de la Partida Aduanera`) %>%
summarise(
valor_fob = sum(`U$ FOB Tot`,na.rm = T)
) %>%
ungroup() %>%
arrange(desc(valor_fob)) %>%
rename(descripcion_veritrade = `Descripcion de la Partida Aduanera`) %>%
left_join(partidas_sunat %>%
select(-`Nro Partida`,-`descargado veritrade`) %>%
rename(`Partida Aduanera` = `Nro Partida 2`) %>%
distinct(), by = "Partida Aduanera" ) %>%
rename(descripcion_sunat = `Descripción de Partida`) %>%
relocate(`Partida Aduanera`,descripcion_veritrade, descripcion_sunat, valor_fob) %>%
right_join(partidas_sunat %>%
rename(`Partida Aduanera` = `Nro Partida 2`) %>%
distinct(), by = "Partida Aduanera") %>%
View()
`summarise()` has grouped output by 'Partida Aduanera'. You can override using the `.groups` argument.
Partidas arancelarias relacionads a Shihuahuaco.
- Según Osinfor, estos son los nombres científicos que están relacionados al shihuahuaco.Coumarouna micrantha, Coumarouna odorata, Dipterex alatam, Dipteryx micrantha, Dipteryx odorata.
Evolución de las partidas arancelarias relacionadas a shihuahuaco
Por valor FOB US$
Viz
ggplot(data = exp_madera %>%
filter(str_detect(`Descripcion Comercial`,
regex("shihuahuaco|Coumarouna micrantha|Coumarouna odorata|Dipterex alatam|Dipteryx micrantha|Dipteryx odorata|cumaru", ignore_case = T))) %>%
mutate(
grupo_partida = case_when(
str_detect(`Partida Aduanera`, "^4401") ~ "4401 - Leña",
str_detect(`Partida Aduanera`, "^4403") ~ "4403 - Bruto tropicales",
str_detect(`Partida Aduanera`, "^4407") ~ "4407 - Aserrada o desbastada",
str_detect(`Partida Aduanera`, "^4408") ~ "4408 - Hojas chapado",
str_detect(`Partida Aduanera`, "^4409") ~ "4409 - Tablillas, moldurada, coníferas,otros",
str_detect(`Partida Aduanera`, "^4410") ~ "4410 - Tableros",
str_detect(`Partida Aduanera`, "^4418") ~ "4418 - Piezas y obras carpintería",
str_detect(`Partida Aduanera`, "^4421") ~ "4421 - Demás manufactura",
str_detect(`Partida Aduanera`, "^9403") ~ "9403 - Muebles"
)
),
aes(x=anio,
y=`U$ FOB Tot`,
fill = grupo_partida)) +
geom_col()+
scale_y_continuous(label = scales::number_format(big.mark = ".",decimal.mark = ","))

Ranking
exp_madera %>%
filter(str_detect(`Descripcion Comercial`,
regex("shihuahuaco|Coumarouna micrantha|Coumarouna odorata|Dipterex alatam|Dipteryx micrantha|Dipteryx odorata|cumaru", ignore_case = T))) %>%
mutate(
grupo_partida = case_when(
str_detect(`Partida Aduanera`, "^4401") ~ "4401 - Leña",
str_detect(`Partida Aduanera`, "^4403") ~ "4403 - Bruto tropicales",
str_detect(`Partida Aduanera`, "^4407") ~ "4407 - Aserrada o desbastada",
str_detect(`Partida Aduanera`, "^4408") ~ "4408 - Hojas chapado",
str_detect(`Partida Aduanera`, "^4409") ~ "4409 - Tablillas, moldurada, coníferas,otros",
str_detect(`Partida Aduanera`, "^4410") ~ "4410 - Tableros",
str_detect(`Partida Aduanera`, "^4418") ~ "4418 - Piezas y obras carpintería",
str_detect(`Partida Aduanera`, "^4421") ~ "4421 - Demás manufactura",
str_detect(`Partida Aduanera`, "^9403") ~ "9403 - Muebles"
)
) %>%
group_by(grupo_partida) %>%
summarise(
valor_fob = sum(`U$ FOB Tot`,na.rm = T),
peso_neto = sum(`Kg Neto`,na.rm = T),
n_registros = n(),
n_empresas = n_distinct(`Cod. Tributario`),
paises_destino = n_distinct(`Pais de Destino`)
) %>%
ungroup() %>%
mutate(
per_valor_fob = valor_fob*100/sum(valor_fob, na.rm = T)
) %>%
arrange(desc(valor_fob)) %>%
DT::datatable(colnames = c("Grupo partida","Valor FOB (US$)","Peso neto (Kg)","Registros","Empresas exportadoras","Países destino","Valor FOB (%)")) %>%
DT::formatRound(columns =2:7 ,digits = 0, mark = ".",dec.mark = ",")
NA
NA
Por peso Neto KG
ggplot(data = exp_madera %>%
filter(str_detect(`Descripcion Comercial`,
regex("shihuahuaco|Coumarouna micrantha|Coumarouna odorata|Dipterex alatam|Dipteryx micrantha|Dipteryx odorata|cumaru", ignore_case = T))) %>%
mutate(
grupo_partida = case_when(
str_detect(`Partida Aduanera`, "^4401") ~ "4401 - Leña",
str_detect(`Partida Aduanera`, "^4403") ~ "4403 - Bruto tropicales",
str_detect(`Partida Aduanera`, "^4407") ~ "4407 - Aserrada o desbastada",
str_detect(`Partida Aduanera`, "^4408") ~ "4408 - Hojas chapado",
str_detect(`Partida Aduanera`, "^4409") ~ "4409 - Tablillas, moldurada, coníferas,otros",
str_detect(`Partida Aduanera`, "^4410") ~ "4410 - Tableros",
str_detect(`Partida Aduanera`, "^4418") ~ "4418 - Piezas y obras carpintería",
str_detect(`Partida Aduanera`, "^4421") ~ "4421 - Demás manufactura",
str_detect(`Partida Aduanera`, "^9403") ~ "9403 - Muebles"
)
),
aes(x=anio,
y=`Kg Neto`,
fill = grupo_partida)) +
geom_col()+
scale_y_continuous(label = scales::number_format(big.mark = ".",decimal.mark = ","))

Shihuahuaco frente a todas las exportaciones de madera
- En rojo: exportaciones de shihuahuaco
- En gris: exportaciones totales
Por valor FOB US$
ggplot()+
geom_col(data = exp_madera, aes(x=anio, y = `U$ FOB Tot`))+
geom_col(data = exp_madera %>%
filter(str_detect(`Descripcion Comercial`,
regex("shihuahuaco|Coumarouna micrantha|Coumarouna odorata|Dipterex alatam|Dipteryx micrantha|Dipteryx odorata|cumaru", ignore_case = T)))
, aes(x=anio, y = `U$ FOB Tot`), fill = "red")+
scale_y_continuous(label = scales::number_format(big.mark = ".",decimal.mark = ","))

Por peso Neto KG
ggplot()+
geom_col(data = exp_madera, aes(x=anio, y = `Kg Neto`))+
geom_col(data = exp_madera %>%
filter(str_detect(`Descripcion Comercial`,
regex("shihuahuaco|Coumarouna micrantha|Coumarouna odorata|Dipterex alatam|Dipteryx micrantha|Dipteryx odorata|cumaru", ignore_case = T)))
, aes(x=anio, y = `Kg Neto`), fill = "red")+
scale_y_continuous(label = scales::number_format(big.mark = ".",decimal.mark = ","))

Qué empresas han exportado más Shihuahuaco
exp_madera %>%
filter(str_detect(`Descripcion Comercial`, regex("shihuahuaco|Coumarouna micrantha|Coumarouna odorata|Dipterex alatam|Dipteryx micrantha|Dipteryx odorata|cumaru", ignore_case = T))) %>%
group_by(Exportador) %>%
summarise(
valor_fob = sum(`U$ FOB Tot`,na.rm = T),
peso_neto = sum(`Kg Neto`,na.rm = T),
n_registros = n(),
n_empresas = n_distinct(`Cod. Tributario`),
paises_destino = n_distinct(`Pais de Destino`)
) %>%
ungroup() %>%
mutate(
per_valor_fob = valor_fob*100/sum(valor_fob, na.rm = T)
) %>%
arrange(desc(valor_fob)) %>%
DT::datatable(colnames = c("Exportador","Valor FOB (US$)","Peso neto (Kg)","Registros","Empresas exportadoras","Países destino","Valor FOB (%)")) %>%
DT::formatRound(columns =2:7 ,digits = 0, mark = ".",dec.mark = ",")
Qué países han recibido más Shihuahuaco desde Perú
exp_madera %>%
filter(str_detect(`Descripcion Comercial`, regex("shihuahuaco|Coumarouna micrantha|Coumarouna odorata|Dipterex alatam|Dipteryx micrantha|Dipteryx odorata|cumaru", ignore_case = T))) %>%
group_by(`Pais de Destino`) %>%
summarise(
valor_fob = sum(`U$ FOB Tot`,na.rm = T),
peso_neto = sum(`Kg Neto`,na.rm = T),
n_registros = n(),
n_empresas = n_distinct(`Cod. Tributario`),
paises_destino = n_distinct(`Pais de Destino`)
) %>%
ungroup() %>%
mutate(
per_valor_fob = valor_fob*100/sum(valor_fob, na.rm = T)
) %>%
arrange(desc(valor_fob)) %>%
DT::datatable(colnames = c("País destino","Valor FOB (US$)","Peso neto (Kg)","Registros","Empresas exportadoras","Países destino","Valor FOB (%)")) %>%
DT::formatRound(columns =2:7 ,digits = 0, mark = ".",dec.mark = ",")
LS0tCnRpdGxlOiAiUmVwb3J0ZSBhbsOhbGlzaXMgbWFkZXJhIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogIGh0bWxfbm90ZWJvb2s6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKZWRpdG9yX29wdGlvbnM6CiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHJlc2hhcGUyKQpsaWJyYXJ5KGdvb2dsZXNoZWV0czQpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShzY2FsZXMpCmxpYnJhcnkoZ3JpZCkKbGlicmFyeShrbml0cikKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoc3RyaW5naSkKbGlicmFyeShEVCkKbGlicmFyeShyZWFkeGwpCgpgYGAKCiMgKipJbnRyb2R1Y2Npw7NuKioKCi0gUGFyYSBlc3RlIGFuw6FsaXNpcyBzZSBkZXNjYXJnw7MgbXVsdGlwbGVzIGFyY2hpdm9zIGV4Y2VsIGRlIHZlcml0cmFkZSByZWxhY2lvbmFkb3MgYSBleHBvcnRhY2lvbmVzIGRlIG1hZGVyYS4gCi0gUXVlcmVtb3MgZGV0ZXJtaW5hciBsYXMgcGFydGlkYXMgYXJhbmNlbGFyaWFzIHF1ZSBtdWV2ZW4gbcOhcyBkaW5lcm8gZW4gbGFzIGV4cG9ydGFjaW9lbnMgZGUgbWFkZXJhIGRlc2RlIFBlcsO6LgotIFNlIGVsaW1pbmFyb24gbGFzIHBhcnRpZGFzIGFyYW5jZWxhcmlhcyByZWxhY2lvbmFkYXMgYWwgY29icmUgeSBvdHJhcyBxdWUgbm8gY29ycmVzcG9uZMOtYW4gYSBtYWRlcmEuCgojIyMgKipMaXN0YSBkZSBjYW1iaW9zL2NvcnJlY2lvbmVzKioKLSAgTm9zIHF1ZWRhbW9zIGNvbiB0b2RhcyBsYXMgcXVlIGVtcGllemFuIGNvbiBlbCBjw7NkaWdvICI0NHh4eHh4eCIgeSBhZGVtw6FzIGNvbiBwYXJ0aWRhcyBhcmFuY2VsYXJpYXMgZGUgb3RybyBjw7NkaWdvIHBlcm8gYXNvY2lhZGFzIGEgbWFkZXJhIHF1ZSBzZSBlbmNvbnRyYWJhbiBlbnRyZSBsYXMgcHJpbWVyYXMgNTAgZGVsIHJhbmtpbmcgYW50ZXJpb3IuCi0gU2UgYWdyZWfDsyBldm9sdWNpw7NuIGRlIGxhcyBleHBvcnRhY2lvbmVzIGRlIG1hZGVyYSBwb3IgcGHDrXMgZGUgZGVzdGlubwoKYGBge3J9CiNJbXBvcnRhbmRvIGRhdGEgdmVyaXRyYWRlCmV4cF9tYWRlcmEgPC0KICAgIGxpc3QuZmlsZXMocGF0aCA9ICJ+L3JfcHJvamVjdHMvY2hvbXBpcmFzL2RhdGEgcGFydGlkYXMgYXJhbmNlbGFyaWFzL2V4cG9ydGFjaW9uZXMiLAogICAgICAgICAgICAgICBwYXR0ZXJuID0gIioueGxzeCIsIAogICAgICAgICAgICAgICBmdWxsLm5hbWVzID0gVCkgJT4lIAogICAgbWFwX2RmKH5yZWFkX2V4Y2VsKC4sc2tpcCA9IDUsIGNvbF90eXBlcyA9IGMoInRleHQiLCJ0ZXh0IiwidGV4dCIsInRleHQiLCJkYXRlIiwidGV4dCIsInRleHQiLCJ0ZXh0IiwibnVtZXJpYyIsIm51bWVyaWMiLCJudW1lcmljIiwidGV4dCIsIm51bWVyaWMiLCJ0ZXh0IiwibnVtZXJpYyIsIm51bWVyaWMiLCJudW1lcmljIiwidGV4dCIsInRleHQiLCJ0ZXh0IiwidGV4dCIsInRleHQiLCJ0ZXh0IiwidGV4dCIsInRleHQiLCJ0ZXh0IiwidGV4dCIsInRleHQiLCJ0ZXh0IiwidGV4dCIsInRleHQiLCJ0ZXh0IikpKSAlPiUgCiAgYXNfdGliYmxlKCkgJT4lIAogICBzZXBhcmF0ZSgKICAgIEZlY2hhLCBpbnRvID1jKCdhbmlvJywnbWVzJywnZGlhJykKICApICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChgUGFydGlkYSBBZHVhbmVyYWAsIl40NHw5NDAzNjAwMDAwfDk0MDM1MDAwMDB8OTQwMTYxMDAwMHw5NDAxNjkwMDAwfDk0MDMzMDAwMDAiKSkgJT4lIAogIGRpc3RpbmN0KCkKICAKYGBgCgojIyBSYW5raW5nIHBhcnRpZGFzIGFyYW5jZWxhcmlhc3sudGFic2V0fQoKIyMjIEFjdW11bGFkbyAyMDEyLTIwMjAKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZXhwX21hZGVyYSAlPiUgCiAgZHBseXI6Omdyb3VwX2J5KGBQYXJ0aWRhIEFkdWFuZXJhYCwgYERlc2NyaXBjaW9uIGRlIGxhIFBhcnRpZGEgQWR1YW5lcmFgKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgdmFsb3JfZm9iID0gc3VtKGBVJCBGT0IgVG90YCxuYS5ybSA9IFQpLAogICAgcGVzb19uZXRvID0gc3VtKGBLZyBOZXRvYCxuYS5ybSA9IFQpLAogICAgbl9yZWdpc3Ryb3MgPSBuKCksCiAgICBuX2VtcHJlc2FzID0gbl9kaXN0aW5jdChgQ29kLiBUcmlidXRhcmlvYCksCiAgICBwYWlzZXNfZGVzdGlubyA9IG5fZGlzdGluY3QoYFBhaXMgZGUgRGVzdGlub2ApCiAgKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBtdXRhdGUoCiAgICBwZXJfdmFsb3JfZm9iID0gdmFsb3JfZm9iKjEwMC9zdW0odmFsb3JfZm9iLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKHZhbG9yX2ZvYikpICU+JSAKICBEVDo6ZGF0YXRhYmxlKGNvbG5hbWVzID0gYygiUGFydGlkYSBhZHVhbmVyYSIsIlBhcnRpZGEgYWR1YW5lcmEgMiIsIlZhbG9yIEZPQiAoVVMkKSIsIlBlc28gbmV0byAoS2cpIiwiUmVnaXN0cm9zIiwiRW1wcmVzYXMgZXhwb3J0YWRvcmFzIiwiUGHDrXNlcyBkZXN0aW5vIiwiVmFsb3IgRk9CICglKSIpKSAlPiUgCiAgRFQ6OmZvcm1hdFJvdW5kKGNvbHVtbnMgPTM6OCAsZGlnaXRzID0gMCwgbWFyayA9ICIuIixkZWMubWFyayA9ICIsIikgCgpgYGAKCiMjIyAyMDIwCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpleHBfbWFkZXJhICU+JSAKICBmaWx0ZXIoYW5pbyA9PSAnMjAyMCcpICU+JSAKICBmaWx0ZXIoIXN0cl9kZXRlY3QoYFBhcnRpZGEgQWR1YW5lcmFgLCJeNzQwIikpICU+JSAKICBkcGx5cjo6Z3JvdXBfYnkoYFBhcnRpZGEgQWR1YW5lcmFgLCBgRGVzY3JpcGNpb24gZGUgbGEgUGFydGlkYSBBZHVhbmVyYWApICU+JSAKICBzdW1tYXJpc2UoCiAgICB2YWxvcl9mb2IgPSBzdW0oYFUkIEZPQiBUb3RgLG5hLnJtID0gVCksCiAgICBwZXNvX25ldG8gPSBzdW0oYEtnIE5ldG9gLG5hLnJtID0gVCksCiAgICBuX3JlZ2lzdHJvcyA9IG4oKSwKICAgIG5fZW1wcmVzYXMgPSBuX2Rpc3RpbmN0KGBDb2QuIFRyaWJ1dGFyaW9gKSwKICAgIHBhaXNlc19kZXN0aW5vID0gbl9kaXN0aW5jdChgUGFpcyBkZSBEZXN0aW5vYCkKICApICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIG11dGF0ZSgKICAgIHBlcl92YWxvcl9mb2IgPSB2YWxvcl9mb2IqMTAwL3N1bSh2YWxvcl9mb2IsIG5hLnJtID0gVCkKICApICU+JSAKICBhcnJhbmdlKGRlc2ModmFsb3JfZm9iKSkgJT4lIAogIERUOjpkYXRhdGFibGUoY29sbmFtZXMgPSBjKCJQYXJ0aWRhIGFkdWFuZXJhIiwiUGFydGlkYSBhZHVhbmVyYSAyIiwiVmFsb3IgRk9CIChVUyQpIiwiUGVzbyBuZXRvIChLZykiLCJSZWdpc3Ryb3MiLCJFbXByZXNhcyBleHBvcnRhZG9yYXMiLCJQYcOtc2VzIGRlc3Rpbm8iLCJWYWxvciBGT0IgKCUpIikpICU+JSAKICBEVDo6Zm9ybWF0Um91bmQoY29sdW1ucyA9Mzo4ICxkaWdpdHMgPSAwLCBtYXJrID0gIi4iLGRlYy5tYXJrID0gIiwiKSAKYGBgCgojIyMgMjAxOQoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZXhwX21hZGVyYSAlPiUgCiAgZmlsdGVyKGFuaW8gPT0gJzIwMTknKSAlPiUgCiAgZmlsdGVyKCFzdHJfZGV0ZWN0KGBQYXJ0aWRhIEFkdWFuZXJhYCwiXjc0MCIpKSAlPiUgCiAgZHBseXI6Omdyb3VwX2J5KGBQYXJ0aWRhIEFkdWFuZXJhYCwgYERlc2NyaXBjaW9uIGRlIGxhIFBhcnRpZGEgQWR1YW5lcmFgKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgdmFsb3JfZm9iID0gc3VtKGBVJCBGT0IgVG90YCxuYS5ybSA9IFQpLAogICAgcGVzb19uZXRvID0gc3VtKGBLZyBOZXRvYCxuYS5ybSA9IFQpLAogICAgbl9yZWdpc3Ryb3MgPSBuKCksCiAgICBuX2VtcHJlc2FzID0gbl9kaXN0aW5jdChgQ29kLiBUcmlidXRhcmlvYCksCiAgICBwYWlzZXNfZGVzdGlubyA9IG5fZGlzdGluY3QoYFBhaXMgZGUgRGVzdGlub2ApCiAgKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBtdXRhdGUoCiAgICBwZXJfdmFsb3JfZm9iID0gdmFsb3JfZm9iKjEwMC9zdW0odmFsb3JfZm9iLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKHZhbG9yX2ZvYikpICU+JSAKICBEVDo6ZGF0YXRhYmxlKGNvbG5hbWVzID0gYygiUGFydGlkYSBhZHVhbmVyYSIsIlBhcnRpZGEgYWR1YW5lcmEgMiIsIlZhbG9yIEZPQiAoVVMkKSIsIlBlc28gbmV0byAoS2cpIiwiUmVnaXN0cm9zIiwiRW1wcmVzYXMgZXhwb3J0YWRvcmFzIiwiUGHDrXNlcyBkZXN0aW5vIiwiVmFsb3IgRk9CICglKSIpKSAlPiUgCiAgRFQ6OmZvcm1hdFJvdW5kKGNvbHVtbnMgPTM6OCAsZGlnaXRzID0gMCwgbWFyayA9ICIuIixkZWMubWFyayA9ICIsIikgCmBgYAojIyMgMjAxOApgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpleHBfbWFkZXJhICU+JSAKICBmaWx0ZXIoYW5pbyA9PSAnMjAxOCcpICU+JSAKICBmaWx0ZXIoIXN0cl9kZXRlY3QoYFBhcnRpZGEgQWR1YW5lcmFgLCJeNzQwIikpICU+JSAKICBkcGx5cjo6Z3JvdXBfYnkoYFBhcnRpZGEgQWR1YW5lcmFgLCBgRGVzY3JpcGNpb24gZGUgbGEgUGFydGlkYSBBZHVhbmVyYWApICU+JSAKICBzdW1tYXJpc2UoCiAgICB2YWxvcl9mb2IgPSBzdW0oYFUkIEZPQiBUb3RgLG5hLnJtID0gVCksCiAgICBwZXNvX25ldG8gPSBzdW0oYEtnIE5ldG9gLG5hLnJtID0gVCksCiAgICBuX3JlZ2lzdHJvcyA9IG4oKSwKICAgIG5fZW1wcmVzYXMgPSBuX2Rpc3RpbmN0KGBDb2QuIFRyaWJ1dGFyaW9gKSwKICAgIHBhaXNlc19kZXN0aW5vID0gbl9kaXN0aW5jdChgUGFpcyBkZSBEZXN0aW5vYCkKICApICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIG11dGF0ZSgKICAgIHBlcl92YWxvcl9mb2IgPSB2YWxvcl9mb2IqMTAwL3N1bSh2YWxvcl9mb2IsIG5hLnJtID0gVCkKICApICU+JSAKICBhcnJhbmdlKGRlc2ModmFsb3JfZm9iKSkgJT4lIAogIERUOjpkYXRhdGFibGUoY29sbmFtZXMgPSBjKCJQYXJ0aWRhIGFkdWFuZXJhIiwiUGFydGlkYSBhZHVhbmVyYSAyIiwiVmFsb3IgRk9CIChVUyQpIiwiUGVzbyBuZXRvIChLZykiLCJSZWdpc3Ryb3MiLCJFbXByZXNhcyBleHBvcnRhZG9yYXMiLCJQYcOtc2VzIGRlc3Rpbm8iLCJWYWxvciBGT0IgKCUpIikpICU+JSAKICBEVDo6Zm9ybWF0Um91bmQoY29sdW1ucyA9Mzo4ICxkaWdpdHMgPSAwLCBtYXJrID0gIi4iLGRlYy5tYXJrID0gIiwiKSAKYGBgCiMjIyAyMDE3CmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmV4cF9tYWRlcmEgJT4lIAogIGZpbHRlcihhbmlvID09ICcyMDE3JykgJT4lIAogIGZpbHRlcighc3RyX2RldGVjdChgUGFydGlkYSBBZHVhbmVyYWAsIl43NDAiKSkgJT4lIAogIGRwbHlyOjpncm91cF9ieShgUGFydGlkYSBBZHVhbmVyYWAsIGBEZXNjcmlwY2lvbiBkZSBsYSBQYXJ0aWRhIEFkdWFuZXJhYCkgJT4lIAogIHN1bW1hcmlzZSgKICAgIHZhbG9yX2ZvYiA9IHN1bShgVSQgRk9CIFRvdGAsbmEucm0gPSBUKSwKICAgIHBlc29fbmV0byA9IHN1bShgS2cgTmV0b2AsbmEucm0gPSBUKSwKICAgIG5fcmVnaXN0cm9zID0gbigpLAogICAgbl9lbXByZXNhcyA9IG5fZGlzdGluY3QoYENvZC4gVHJpYnV0YXJpb2ApLAogICAgcGFpc2VzX2Rlc3Rpbm8gPSBuX2Rpc3RpbmN0KGBQYWlzIGRlIERlc3Rpbm9gKQogICkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgbXV0YXRlKAogICAgcGVyX3ZhbG9yX2ZvYiA9IHZhbG9yX2ZvYioxMDAvc3VtKHZhbG9yX2ZvYiwgbmEucm0gPSBUKQogICkgJT4lIAogIGFycmFuZ2UoZGVzYyh2YWxvcl9mb2IpKSAlPiUgCiAgRFQ6OmRhdGF0YWJsZShjb2xuYW1lcyA9IGMoIlBhcnRpZGEgYWR1YW5lcmEiLCJQYXJ0aWRhIGFkdWFuZXJhIDIiLCJWYWxvciBGT0IgKFVTJCkiLCJQZXNvIG5ldG8gKEtnKSIsIlJlZ2lzdHJvcyIsIkVtcHJlc2FzIGV4cG9ydGFkb3JhcyIsIlBhw61zZXMgZGVzdGlubyIsIlZhbG9yIEZPQiAoJSkiKSkgJT4lIAogIERUOjpmb3JtYXRSb3VuZChjb2x1bW5zID0zOjggLGRpZ2l0cyA9IDAsIG1hcmsgPSAiLiIsZGVjLm1hcmsgPSAiLCIpIApgYGAKIyMjIDIwMTYKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZXhwX21hZGVyYSAlPiUgCiAgZmlsdGVyKGFuaW8gPT0gJzIwMTYnKSAlPiUgCiAgZmlsdGVyKCFzdHJfZGV0ZWN0KGBQYXJ0aWRhIEFkdWFuZXJhYCwiXjc0MCIpKSAlPiUgCiAgZHBseXI6Omdyb3VwX2J5KGBQYXJ0aWRhIEFkdWFuZXJhYCwgYERlc2NyaXBjaW9uIGRlIGxhIFBhcnRpZGEgQWR1YW5lcmFgKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgdmFsb3JfZm9iID0gc3VtKGBVJCBGT0IgVG90YCxuYS5ybSA9IFQpLAogICAgcGVzb19uZXRvID0gc3VtKGBLZyBOZXRvYCxuYS5ybSA9IFQpLAogICAgbl9yZWdpc3Ryb3MgPSBuKCksCiAgICBuX2VtcHJlc2FzID0gbl9kaXN0aW5jdChgQ29kLiBUcmlidXRhcmlvYCksCiAgICBwYWlzZXNfZGVzdGlubyA9IG5fZGlzdGluY3QoYFBhaXMgZGUgRGVzdGlub2ApCiAgKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBtdXRhdGUoCiAgICBwZXJfdmFsb3JfZm9iID0gdmFsb3JfZm9iKjEwMC9zdW0odmFsb3JfZm9iLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKHZhbG9yX2ZvYikpICU+JSAKICBEVDo6ZGF0YXRhYmxlKGNvbG5hbWVzID0gYygiUGFydGlkYSBhZHVhbmVyYSIsIlBhcnRpZGEgYWR1YW5lcmEgMiIsIlZhbG9yIEZPQiAoVVMkKSIsIlBlc28gbmV0byAoS2cpIiwiUmVnaXN0cm9zIiwiRW1wcmVzYXMgZXhwb3J0YWRvcmFzIiwiUGHDrXNlcyBkZXN0aW5vIiwiVmFsb3IgRk9CICglKSIpKSAlPiUgCiAgRFQ6OmZvcm1hdFJvdW5kKGNvbHVtbnMgPTM6OCAsZGlnaXRzID0gMCwgbWFyayA9ICIuIixkZWMubWFyayA9ICIsIikgCmBgYAojIyMgMjAxNQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpleHBfbWFkZXJhICU+JSAKICBmaWx0ZXIoYW5pbyA9PSAnMjAxNScpICU+JSAKICBmaWx0ZXIoIXN0cl9kZXRlY3QoYFBhcnRpZGEgQWR1YW5lcmFgLCJeNzQwIikpICU+JSAKICBkcGx5cjo6Z3JvdXBfYnkoYFBhcnRpZGEgQWR1YW5lcmFgLCBgRGVzY3JpcGNpb24gZGUgbGEgUGFydGlkYSBBZHVhbmVyYWApICU+JSAKICBzdW1tYXJpc2UoCiAgICB2YWxvcl9mb2IgPSBzdW0oYFUkIEZPQiBUb3RgLG5hLnJtID0gVCksCiAgICBwZXNvX25ldG8gPSBzdW0oYEtnIE5ldG9gLG5hLnJtID0gVCksCiAgICBuX3JlZ2lzdHJvcyA9IG4oKSwKICAgIG5fZW1wcmVzYXMgPSBuX2Rpc3RpbmN0KGBDb2QuIFRyaWJ1dGFyaW9gKSwKICAgIHBhaXNlc19kZXN0aW5vID0gbl9kaXN0aW5jdChgUGFpcyBkZSBEZXN0aW5vYCkKICApICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIG11dGF0ZSgKICAgIHBlcl92YWxvcl9mb2IgPSB2YWxvcl9mb2IqMTAwL3N1bSh2YWxvcl9mb2IsIG5hLnJtID0gVCkKICApICU+JSAKICBhcnJhbmdlKGRlc2ModmFsb3JfZm9iKSkgJT4lIAogIERUOjpkYXRhdGFibGUoY29sbmFtZXMgPSBjKCJQYXJ0aWRhIGFkdWFuZXJhIiwiUGFydGlkYSBhZHVhbmVyYSAyIiwiVmFsb3IgRk9CIChVUyQpIiwiUGVzbyBuZXRvIChLZykiLCJSZWdpc3Ryb3MiLCJFbXByZXNhcyBleHBvcnRhZG9yYXMiLCJQYcOtc2VzIGRlc3Rpbm8iLCJWYWxvciBGT0IgKCUpIikpICU+JSAKICBEVDo6Zm9ybWF0Um91bmQoY29sdW1ucyA9Mzo4ICxkaWdpdHMgPSAwLCBtYXJrID0gIi4iLGRlYy5tYXJrID0gIiwiKSAKYGBgCiMjIyAyMDE0CmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmV4cF9tYWRlcmEgJT4lIAogIGZpbHRlcihhbmlvID09ICcyMDE0JykgJT4lIAogIGZpbHRlcighc3RyX2RldGVjdChgUGFydGlkYSBBZHVhbmVyYWAsIl43NDAiKSkgJT4lIAogIGRwbHlyOjpncm91cF9ieShgUGFydGlkYSBBZHVhbmVyYWAsIGBEZXNjcmlwY2lvbiBkZSBsYSBQYXJ0aWRhIEFkdWFuZXJhYCkgJT4lIAogIHN1bW1hcmlzZSgKICAgIHZhbG9yX2ZvYiA9IHN1bShgVSQgRk9CIFRvdGAsbmEucm0gPSBUKSwKICAgIHBlc29fbmV0byA9IHN1bShgS2cgTmV0b2AsbmEucm0gPSBUKSwKICAgIG5fcmVnaXN0cm9zID0gbigpLAogICAgbl9lbXByZXNhcyA9IG5fZGlzdGluY3QoYENvZC4gVHJpYnV0YXJpb2ApLAogICAgcGFpc2VzX2Rlc3Rpbm8gPSBuX2Rpc3RpbmN0KGBQYWlzIGRlIERlc3Rpbm9gKQogICkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgbXV0YXRlKAogICAgcGVyX3ZhbG9yX2ZvYiA9IHZhbG9yX2ZvYioxMDAvc3VtKHZhbG9yX2ZvYiwgbmEucm0gPSBUKQogICkgJT4lIAogIGFycmFuZ2UoZGVzYyh2YWxvcl9mb2IpKSAlPiUgCiAgRFQ6OmRhdGF0YWJsZShjb2xuYW1lcyA9IGMoIlBhcnRpZGEgYWR1YW5lcmEiLCJQYXJ0aWRhIGFkdWFuZXJhIDIiLCJWYWxvciBGT0IgKFVTJCkiLCJQZXNvIG5ldG8gKEtnKSIsIlJlZ2lzdHJvcyIsIkVtcHJlc2FzIGV4cG9ydGFkb3JhcyIsIlBhw61zZXMgZGVzdGlubyIsIlZhbG9yIEZPQiAoJSkiKSkgJT4lIAogIERUOjpmb3JtYXRSb3VuZChjb2x1bW5zID0zOjggLGRpZ2l0cyA9IDAsIG1hcmsgPSAiLiIsZGVjLm1hcmsgPSAiLCIpIApgYGAKIyMjIDIwMTMKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZXhwX21hZGVyYSAlPiUgCiAgZmlsdGVyKGFuaW8gPT0gJzIwMTMnKSAlPiUgCiAgZmlsdGVyKCFzdHJfZGV0ZWN0KGBQYXJ0aWRhIEFkdWFuZXJhYCwiXjc0MCIpKSAlPiUgCiAgZHBseXI6Omdyb3VwX2J5KGBQYXJ0aWRhIEFkdWFuZXJhYCwgYERlc2NyaXBjaW9uIGRlIGxhIFBhcnRpZGEgQWR1YW5lcmFgKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgdmFsb3JfZm9iID0gc3VtKGBVJCBGT0IgVG90YCxuYS5ybSA9IFQpLAogICAgcGVzb19uZXRvID0gc3VtKGBLZyBOZXRvYCxuYS5ybSA9IFQpLAogICAgbl9yZWdpc3Ryb3MgPSBuKCksCiAgICBuX2VtcHJlc2FzID0gbl9kaXN0aW5jdChgQ29kLiBUcmlidXRhcmlvYCksCiAgICBwYWlzZXNfZGVzdGlubyA9IG5fZGlzdGluY3QoYFBhaXMgZGUgRGVzdGlub2ApCiAgKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBtdXRhdGUoCiAgICBwZXJfdmFsb3JfZm9iID0gdmFsb3JfZm9iKjEwMC9zdW0odmFsb3JfZm9iLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKHZhbG9yX2ZvYikpICU+JSAKICBEVDo6ZGF0YXRhYmxlKGNvbG5hbWVzID0gYygiUGFydGlkYSBhZHVhbmVyYSIsIlBhcnRpZGEgYWR1YW5lcmEgMiIsIlZhbG9yIEZPQiAoVVMkKSIsIlBlc28gbmV0byAoS2cpIiwiUmVnaXN0cm9zIiwiRW1wcmVzYXMgZXhwb3J0YWRvcmFzIiwiUGHDrXNlcyBkZXN0aW5vIiwiVmFsb3IgRk9CICglKSIpKSAlPiUgCiAgRFQ6OmZvcm1hdFJvdW5kKGNvbHVtbnMgPTM6OCAsZGlnaXRzID0gMCwgbWFyayA9ICIuIixkZWMubWFyayA9ICIsIikgCmBgYAojIyMgMjAxMgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpleHBfbWFkZXJhICU+JSAKICBmaWx0ZXIoYW5pbyA9PSAnMjAxMicpICU+JSAKICBmaWx0ZXIoIXN0cl9kZXRlY3QoYFBhcnRpZGEgQWR1YW5lcmFgLCJeNzQwIikpICU+JSAKICBkcGx5cjo6Z3JvdXBfYnkoYFBhcnRpZGEgQWR1YW5lcmFgLCBgRGVzY3JpcGNpb24gZGUgbGEgUGFydGlkYSBBZHVhbmVyYWApICU+JSAKICBzdW1tYXJpc2UoCiAgICB2YWxvcl9mb2IgPSBzdW0oYFUkIEZPQiBUb3RgLG5hLnJtID0gVCksCiAgICBwZXNvX25ldG8gPSBzdW0oYEtnIE5ldG9gLG5hLnJtID0gVCksCiAgICBuX3JlZ2lzdHJvcyA9IG4oKSwKICAgIG5fZW1wcmVzYXMgPSBuX2Rpc3RpbmN0KGBDb2QuIFRyaWJ1dGFyaW9gKSwKICAgIHBhaXNlc19kZXN0aW5vID0gbl9kaXN0aW5jdChgUGFpcyBkZSBEZXN0aW5vYCkKICApICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIG11dGF0ZSgKICAgIHBlcl92YWxvcl9mb2IgPSB2YWxvcl9mb2IqMTAwL3N1bSh2YWxvcl9mb2IsIG5hLnJtID0gVCkKICApICU+JSAKICBhcnJhbmdlKGRlc2ModmFsb3JfZm9iKSkgJT4lIAogIERUOjpkYXRhdGFibGUoY29sbmFtZXMgPSBjKCJQYXJ0aWRhIGFkdWFuZXJhIiwiUGFydGlkYSBhZHVhbmVyYSAyIiwiVmFsb3IgRk9CIChVUyQpIiwiUGVzbyBuZXRvIChLZykiLCJSZWdpc3Ryb3MiLCJFbXByZXNhcyBleHBvcnRhZG9yYXMiLCJQYcOtc2VzIGRlc3Rpbm8iLCJWYWxvciBGT0IgKCUpIikpICU+JSAKICBEVDo6Zm9ybWF0Um91bmQoY29sdW1ucyA9Mzo4ICxkaWdpdHMgPSAwLCBtYXJrID0gIi4iLGRlYy5tYXJrID0gIiwiKSAKYGBgCiMjIEV2b2x1Y2nDs24gcG9yIGHDsW8gZGUgbGFzIHBhcnRpZGFzIGFyYW5jZWxhcmlhcyBhc29jaWFkYXMgYSBtYWRlcmEgCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpxXzIwMTUgPC0gZXhwX21hZGVyYSAlPiUgCiAgZmlsdGVyKGFuaW8gPT0gJzIwMTUnKSAlPiUgCiAgZ3JvdXBfYnkoYFBhcnRpZGEgQWR1YW5lcmFgLGFuaW8pICU+JSAKICBzdW1tYXJpc2UoCiAgICBjYW50aWRhZCA9IHN1bShgS2cgTmV0b2AsIG5hLnJtID0gVCksCiAgICB2YWxvcl9mb2IgPSBzdW0oYFUkIEZPQiBUb3RgLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKGNhbnRpZGFkKSkgJT4lIAogIGhlYWQoNSkKCnFfMjAxNiA8LSBleHBfbWFkZXJhICU+JSAKICBmaWx0ZXIoYW5pbyA9PSAnMjAxNicpICU+JSAKICBncm91cF9ieShgUGFydGlkYSBBZHVhbmVyYWAsYW5pbykgJT4lIAogIHN1bW1hcmlzZSgKICAgIGNhbnRpZGFkID0gc3VtKGBLZyBOZXRvYCwgbmEucm0gPSBUKSwKICAgIHZhbG9yX2ZvYiA9IHN1bShgVSQgRk9CIFRvdGAsIG5hLnJtID0gVCkKICApICU+JSAKICBhcnJhbmdlKGRlc2MoY2FudGlkYWQpKSAlPiUgCiAgaGVhZCg1KQoKcV8yMDE3IDwtIGV4cF9tYWRlcmEgJT4lIAogIGZpbHRlcihhbmlvID09ICcyMDE3JykgJT4lIAogIGdyb3VwX2J5KGBQYXJ0aWRhIEFkdWFuZXJhYCxhbmlvKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgY2FudGlkYWQgPSBzdW0oYEtnIE5ldG9gLCBuYS5ybSA9IFQpLAogICAgdmFsb3JfZm9iID0gc3VtKGBVJCBGT0IgVG90YCwgbmEucm0gPSBUKQogICkgJT4lIAogIGFycmFuZ2UoZGVzYyhjYW50aWRhZCkpICU+JSAKICBoZWFkKDUpCgpxXzIwMTggPC0gZXhwX21hZGVyYSAlPiUgCiAgZmlsdGVyKGFuaW8gPT0gJzIwMTgnKSAlPiUgCiAgZ3JvdXBfYnkoYFBhcnRpZGEgQWR1YW5lcmFgLGFuaW8pICU+JSAKICBzdW1tYXJpc2UoCiAgICBjYW50aWRhZCA9IHN1bShgS2cgTmV0b2AsIG5hLnJtID0gVCksCiAgICB2YWxvcl9mb2IgPSBzdW0oYFUkIEZPQiBUb3RgLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKGNhbnRpZGFkKSkgJT4lIAogIGhlYWQoNSkKCnFfMjAxOSA8LSBleHBfbWFkZXJhICU+JSAKICBmaWx0ZXIoYW5pbyA9PSAnMjAxOScpICU+JSAKICBncm91cF9ieShgUGFydGlkYSBBZHVhbmVyYWAsYW5pbykgJT4lIAogIHN1bW1hcmlzZSgKICAgIGNhbnRpZGFkID0gc3VtKGBLZyBOZXRvYCwgbmEucm0gPSBUKSwKICAgIHZhbG9yX2ZvYiA9IHN1bShgVSQgRk9CIFRvdGAsIG5hLnJtID0gVCkKICApICU+JSAKICBhcnJhbmdlKGRlc2MoY2FudGlkYWQpKSAlPiUgCiAgaGVhZCg1KQoKcV8yMDIwIDwtIGV4cF9tYWRlcmEgJT4lIAogIGZpbHRlcihhbmlvID09ICcyMDIwJykgJT4lIAogIGdyb3VwX2J5KGBQYXJ0aWRhIEFkdWFuZXJhYCxhbmlvKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgY2FudGlkYWQgPSBzdW0oYEtnIE5ldG9gLCBuYS5ybSA9IFQpLAogICAgdmFsb3JfZm9iID0gc3VtKGBVJCBGT0IgVG90YCwgbmEucm0gPSBUKQogICkgJT4lIAogIGFycmFuZ2UoZGVzYyhjYW50aWRhZCkpICU+JSAKICBoZWFkKDUpCgpxX2ltcCA8LSBiaW5kX3Jvd3MocV8yMDE1LCBxXzIwMTYsIHFfMjAxNywgcV8yMDE4LCBxXzIwMTkscV8yMDIwKQoKdG9fcGxvdCA8LSBxX2ltcCAlPiUgCiAgc2VsZWN0KGBQYXJ0aWRhIEFkdWFuZXJhYCkgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIGlubmVyX2pvaW4oCiAgICBleHBfbWFkZXJhICU+JSBzZWxlY3QoYFBhcnRpZGEgQWR1YW5lcmFgLCBtZXMsIGFuaW8sIGNhbnRpZGFkID0gYEtnIE5ldG9gLCBmb2IgPSBgVSQgRk9CIFRvdGApCiAgKSAlPiUKICBncm91cF9ieShgUGFydGlkYSBBZHVhbmVyYWAsIG1lcywgYW5pbykgJT4lIAogIHN1bW1hcmlzZSgKICAgIGNhbnRpZGFkID0gc3VtKGNhbnRpZGFkLCBuYS5ybSA9IFQpLAogICAgZm9iX21lcyA9IHN1bShmb2IsIG5hLnJtID0gVCkKICApCgoKYSA8LSBnZ3Bsb3QoZGF0YSA9IHRvX3Bsb3QsIGFlcygKICB4PW1lcywgeSA9IGZvYl9tZXMsIGNvbG9yID0gYFBhcnRpZGEgQWR1YW5lcmFgKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZmFjZXRfd3JhcCh+IGFuaW8pKwogIGxhYnMoeD0gIk1lcyIsIHk9IlZhbG9yIEZPQiAoVVMkKSIpKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbCA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChiaWcubWFyayA9ICIuIixkZWNpbWFsLm1hcmsgPSAiLCIpKSsgI2xhYmVsPWZ1bmN0aW9uKHgpe3JldHVybihwYXN0ZSgiTXkgdmFsdWUgaXMiLCB4LCAiZGVncmVlcyIpKX0KICAgIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGZhY2UgPSAiYm9sZCIpLCAjIHBsb3QubWFyZ2luID0gdW5pdChjKDEsMCwxLDEpLCJjbSIpLCAgICAgICAgIAogICAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMSwwLDEsMSksImNtIikpKyAjdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0CiAgc2NhbGVfY29sb3JfZGlzY3JldGUobmFtZSA9ICJQcmluY2lwYWxlcyBwYXJ0aWRhcyBhZHVhbmVyYXMiKQoKYSA8LSBnZ3Bsb3RseShhLCBoZWlnaHQgPSAxMDAwLCB3aWR0aCA9IDEwMDApCgojVWJpY2FuZG8gcG9zaWNpw7NuIGRlbCAibGFiZWwiLCBwZXJvIHF1ZSBuZSByZWFsaWRhZCBlcyB1bmEgYW5vdGFjacOzbi4gUmVmOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80Mjc2MzI4MC9yLWdncGxvdC1hbmQtcGxvdGx5LWF4aXMtbWFyZ2luLXdvbnQtY2hhbmdlCmFbWyd4J11dW1snbGF5b3V0J11dW1snYW5ub3RhdGlvbnMnXV1bWzJdXVtbJ3gnXV0gCgojQ2FtYmlhbmRvIGxhIHBvc2ljacOzbiBkZWwgImxhYmVsIgphW1sneCddXVtbJ2xheW91dCddXVtbJ2Fubm90YXRpb25zJ11dW1syXV1bWyd4J11dIDwtIC0wLjEgCmEKYGBgCgojIyBFdm9sdWNpw7NuIHBvciBhw7FvIGRlIGxhcyBlbXByZXNhcyBleHBvcnRhZG9yYXMgY29uIHRvZGFzIGxhcyBwYXJ0aWRhcyBpbmNsdWlkYXMgYXNvY2lhZGFzIGEgTWFkZXJhLgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCnFfMjAxNSA8LSBleHBfbWFkZXJhICU+JSAKICBmaWx0ZXIoYW5pbyA9PSAnMjAxNScpICU+JSAKICBncm91cF9ieShFeHBvcnRhZG9yLGFuaW8pICU+JSAKICBzdW1tYXJpc2UoCiAgICBjYW50aWRhZCA9IHN1bShgS2cgTmV0b2AsIG5hLnJtID0gVCksCiAgICB2YWxvcl9mb2IgPSBzdW0oYFUkIEZPQiBUb3RgLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKGNhbnRpZGFkKSkgJT4lIAogIGhlYWQoNSkKCnFfMjAxNiA8LSBleHBfbWFkZXJhICU+JSAKICBmaWx0ZXIoYW5pbyA9PSAnMjAxNicpICU+JSAKICBncm91cF9ieShFeHBvcnRhZG9yLGFuaW8pICU+JSAKICBzdW1tYXJpc2UoCiAgICBjYW50aWRhZCA9IHN1bShgS2cgTmV0b2AsIG5hLnJtID0gVCksCiAgICB2YWxvcl9mb2IgPSBzdW0oYFUkIEZPQiBUb3RgLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKGNhbnRpZGFkKSkgJT4lIAogIGhlYWQoNSkKCnFfMjAxNyA8LSBleHBfbWFkZXJhICU+JSAKICBmaWx0ZXIoYW5pbyA9PSAnMjAxNycpICU+JSAKICBncm91cF9ieShFeHBvcnRhZG9yLGFuaW8pICU+JSAKICBzdW1tYXJpc2UoCiAgICBjYW50aWRhZCA9IHN1bShgS2cgTmV0b2AsIG5hLnJtID0gVCksCiAgICB2YWxvcl9mb2IgPSBzdW0oYFUkIEZPQiBUb3RgLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKGNhbnRpZGFkKSkgJT4lIAogIGhlYWQoNSkKCnFfMjAxOCA8LSBleHBfbWFkZXJhICU+JSAKICBmaWx0ZXIoYW5pbyA9PSAnMjAxOCcpICU+JSAKICBncm91cF9ieShFeHBvcnRhZG9yLGFuaW8pICU+JSAKICBzdW1tYXJpc2UoCiAgICBjYW50aWRhZCA9IHN1bShgS2cgTmV0b2AsIG5hLnJtID0gVCksCiAgICB2YWxvcl9mb2IgPSBzdW0oYFUkIEZPQiBUb3RgLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKGNhbnRpZGFkKSkgJT4lIAogIGhlYWQoNSkKCnFfMjAxOSA8LSBleHBfbWFkZXJhICU+JSAKICBmaWx0ZXIoYW5pbyA9PSAnMjAxOScpICU+JSAKICBncm91cF9ieShFeHBvcnRhZG9yLGFuaW8pICU+JSAKICBzdW1tYXJpc2UoCiAgICBjYW50aWRhZCA9IHN1bShgS2cgTmV0b2AsIG5hLnJtID0gVCksCiAgICB2YWxvcl9mb2IgPSBzdW0oYFUkIEZPQiBUb3RgLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKGNhbnRpZGFkKSkgJT4lIAogIGhlYWQoNSkKCnFfMjAyMCA8LSBleHBfbWFkZXJhICU+JSAKICBmaWx0ZXIoYW5pbyA9PSAnMjAyMCcpICU+JSAKICBncm91cF9ieShFeHBvcnRhZG9yLGFuaW8pICU+JSAKICBzdW1tYXJpc2UoCiAgICBjYW50aWRhZCA9IHN1bShgS2cgTmV0b2AsIG5hLnJtID0gVCksCiAgICB2YWxvcl9mb2IgPSBzdW0oYFUkIEZPQiBUb3RgLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKGNhbnRpZGFkKSkgJT4lIAogIGhlYWQoNSkKCnFfaW1wIDwtIGJpbmRfcm93cyhxXzIwMTUsIHFfMjAxNiwgcV8yMDE3LCBxXzIwMTgsIHFfMjAxOSxxXzIwMjApCgp0b19wbG90IDwtIHFfaW1wICU+JSAKICBzZWxlY3QoRXhwb3J0YWRvcikgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIGlubmVyX2pvaW4oCiAgICBleHBfbWFkZXJhICU+JSBzZWxlY3QoRXhwb3J0YWRvciwgbWVzLCBhbmlvLCBjYW50aWRhZCA9IGBLZyBOZXRvYCwgZm9iID0gYFUkIEZPQiBUb3RgKQogICkgJT4lCiAgZ3JvdXBfYnkoRXhwb3J0YWRvciwgbWVzLCBhbmlvKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgY2FudGlkYWQgPSBzdW0oY2FudGlkYWQsIG5hLnJtID0gVCksCiAgICBmb2JfbWVzID0gc3VtKGZvYiwgbmEucm0gPSBUKQogICkKCgphIDwtIGdncGxvdChkYXRhID0gdG9fcGxvdCwgYWVzKAogIHg9bWVzLCB5ID0gZm9iX21lcywgY29sb3IgPSBFeHBvcnRhZG9yKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZmFjZXRfd3JhcCh+IGFuaW8pKwogIGxhYnMoeD0gIk1lcyIsIHk9IlZhbG9yIEZPQiAoVVMkKSIpKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbCA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChiaWcubWFyayA9ICIuIixkZWNpbWFsLm1hcmsgPSAiLCIpKSsgI2xhYmVsPWZ1bmN0aW9uKHgpe3JldHVybihwYXN0ZSgiTXkgdmFsdWUgaXMiLCB4LCAiZGVncmVlcyIpKX0KICAgIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGZhY2UgPSAiYm9sZCIpLCAjIHBsb3QubWFyZ2luID0gdW5pdChjKDEsMCwxLDEpLCJjbSIpLCAgICAgICAgIAogICAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMSwwLDEsMSksImNtIikpKyAjdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0CiAgc2NhbGVfY29sb3JfZGlzY3JldGUobmFtZSA9ICJQcmluY2lwYWxlcyBleHBvcnRhZG9yYXMiKQoKYSA8LSBnZ3Bsb3RseShhLCBoZWlnaHQgPSAxMjAwLCB3aWR0aCA9IDEyMDApCgojVWJpY2FuZG8gcG9zaWNpw7NuIGRlbCAibGFiZWwiLCBwZXJvIHF1ZSBuZSByZWFsaWRhZCBlcyB1bmEgYW5vdGFjacOzbi4gUmVmOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80Mjc2MzI4MC9yLWdncGxvdC1hbmQtcGxvdGx5LWF4aXMtbWFyZ2luLXdvbnQtY2hhbmdlCmFbWyd4J11dW1snbGF5b3V0J11dW1snYW5ub3RhdGlvbnMnXV1bWzJdXVtbJ3gnXV0gCgojQ2FtYmlhbmRvIGxhIHBvc2ljacOzbiBkZWwgImxhYmVsIgphW1sneCddXVtbJ2xheW91dCddXVtbJ2Fubm90YXRpb25zJ11dW1syXV1bWyd4J11dIDwtIC0wLjEgCmEKYGBgCgojIyBQYcOtc2VzIGRlIGRlc3Rpbm8gZGUgbGEgbWFkZXJhCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpxXzIwMTUgPC0gZXhwX21hZGVyYSAlPiUgCiAgZmlsdGVyKGFuaW8gPT0gJzIwMTUnKSAlPiUgCiAgZ3JvdXBfYnkoYFBhaXMgZGUgRGVzdGlub2AsYW5pbykgJT4lIAogIHN1bW1hcmlzZSgKICAgIGNhbnRpZGFkID0gc3VtKGBLZyBOZXRvYCwgbmEucm0gPSBUKSwKICAgIHZhbG9yX2ZvYiA9IHN1bShgVSQgRk9CIFRvdGAsIG5hLnJtID0gVCkKICApICU+JSAKICBhcnJhbmdlKGRlc2MoY2FudGlkYWQpKSAlPiUgCiAgaGVhZCg1KQoKcV8yMDE2IDwtIGV4cF9tYWRlcmEgJT4lIAogIGZpbHRlcihhbmlvID09ICcyMDE2JykgJT4lIAogIGdyb3VwX2J5KGBQYWlzIGRlIERlc3Rpbm9gLGFuaW8pICU+JSAKICBzdW1tYXJpc2UoCiAgICBjYW50aWRhZCA9IHN1bShgS2cgTmV0b2AsIG5hLnJtID0gVCksCiAgICB2YWxvcl9mb2IgPSBzdW0oYFUkIEZPQiBUb3RgLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKGNhbnRpZGFkKSkgJT4lIAogIGhlYWQoNSkKCnFfMjAxNyA8LSBleHBfbWFkZXJhICU+JSAKICBmaWx0ZXIoYW5pbyA9PSAnMjAxNycpICU+JSAKICBncm91cF9ieShgUGFpcyBkZSBEZXN0aW5vYCxhbmlvKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgY2FudGlkYWQgPSBzdW0oYEtnIE5ldG9gLCBuYS5ybSA9IFQpLAogICAgdmFsb3JfZm9iID0gc3VtKGBVJCBGT0IgVG90YCwgbmEucm0gPSBUKQogICkgJT4lIAogIGFycmFuZ2UoZGVzYyhjYW50aWRhZCkpICU+JSAKICBoZWFkKDUpCgpxXzIwMTggPC0gZXhwX21hZGVyYSAlPiUgCiAgZmlsdGVyKGFuaW8gPT0gJzIwMTgnKSAlPiUgCiAgZ3JvdXBfYnkoYFBhaXMgZGUgRGVzdGlub2AsYW5pbykgJT4lIAogIHN1bW1hcmlzZSgKICAgIGNhbnRpZGFkID0gc3VtKGBLZyBOZXRvYCwgbmEucm0gPSBUKSwKICAgIHZhbG9yX2ZvYiA9IHN1bShgVSQgRk9CIFRvdGAsIG5hLnJtID0gVCkKICApICU+JSAKICBhcnJhbmdlKGRlc2MoY2FudGlkYWQpKSAlPiUgCiAgaGVhZCg1KQoKcV8yMDE5IDwtIGV4cF9tYWRlcmEgJT4lIAogIGZpbHRlcihhbmlvID09ICcyMDE5JykgJT4lIAogIGdyb3VwX2J5KGBQYWlzIGRlIERlc3Rpbm9gLGFuaW8pICU+JSAKICBzdW1tYXJpc2UoCiAgICBjYW50aWRhZCA9IHN1bShgS2cgTmV0b2AsIG5hLnJtID0gVCksCiAgICB2YWxvcl9mb2IgPSBzdW0oYFUkIEZPQiBUb3RgLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKGNhbnRpZGFkKSkgJT4lIAogIGhlYWQoNSkKCnFfMjAyMCA8LSBleHBfbWFkZXJhICU+JSAKICBmaWx0ZXIoYW5pbyA9PSAnMjAyMCcpICU+JSAKICBncm91cF9ieShgUGFpcyBkZSBEZXN0aW5vYCxhbmlvKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgY2FudGlkYWQgPSBzdW0oYEtnIE5ldG9gLCBuYS5ybSA9IFQpLAogICAgdmFsb3JfZm9iID0gc3VtKGBVJCBGT0IgVG90YCwgbmEucm0gPSBUKQogICkgJT4lIAogIGFycmFuZ2UoZGVzYyhjYW50aWRhZCkpICU+JSAKICBoZWFkKDUpCgpxX2ltcCA8LSBiaW5kX3Jvd3MocV8yMDE1LCBxXzIwMTYsIHFfMjAxNywgcV8yMDE4LCBxXzIwMTkscV8yMDIwKQoKdG9fcGxvdCA8LSBxX2ltcCAlPiUgCiAgc2VsZWN0KGBQYWlzIGRlIERlc3Rpbm9gKSAlPiUgCiAgZGlzdGluY3QoKSAlPiUgCiAgaW5uZXJfam9pbigKICAgIGV4cF9tYWRlcmEgJT4lIHNlbGVjdChgUGFpcyBkZSBEZXN0aW5vYCwgbWVzLCBhbmlvLCBjYW50aWRhZCA9IGBLZyBOZXRvYCwgZm9iID0gYFUkIEZPQiBUb3RgKQogICkgJT4lCiAgZ3JvdXBfYnkoYFBhaXMgZGUgRGVzdGlub2AsIG1lcywgYW5pbykgJT4lIAogIHN1bW1hcmlzZSgKICAgIGNhbnRpZGFkID0gc3VtKGNhbnRpZGFkLCBuYS5ybSA9IFQpLAogICAgZm9iX21lcyA9IHN1bShmb2IsIG5hLnJtID0gVCkKICApCgoKYSA8LSBnZ3Bsb3QoZGF0YSA9IHRvX3Bsb3QsIGFlcygKICB4PW1lcywgeSA9IGZvYl9tZXMsIGNvbG9yID0gYFBhaXMgZGUgRGVzdGlub2ApKSArCiAgZ2VvbV9wb2ludCgpICsKICBmYWNldF93cmFwKH4gYW5pbykrCiAgbGFicyh4PSAiTWVzIiwgeT0iVmFsb3IgRk9CIChVUyQpIikrCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVsID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGJpZy5tYXJrID0gIi4iLGRlY2ltYWwubWFyayA9ICIsIikpKyAjbGFiZWw9ZnVuY3Rpb24oeCl7cmV0dXJuKHBhc3RlKCJNeSB2YWx1ZSBpcyIsIHgsICJkZWdyZWVzIikpfQogICAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgZmFjZSA9ICJib2xkIiksICMgcGxvdC5tYXJnaW4gPSB1bml0KGMoMSwwLDEsMSksImNtIiksICAgICAgICAgCiAgICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygxLDAsMSwxKSwiY20iKSkrICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShuYW1lID0gIlByaW5jaXBhbGVzIHBhw61zZXMgZGVzdGlubyIpCgphIDwtIGdncGxvdGx5KGEsIGhlaWdodCA9IDEyMDAsIHdpZHRoID0gMTIwMCkKCiNVYmljYW5kbyBwb3NpY2nDs24gZGVsICJsYWJlbCIsIHBlcm8gcXVlIG5lIHJlYWxpZGFkIGVzIHVuYSBhbm90YWNpw7NuLiBSZWY6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQyNzYzMjgwL3ItZ2dwbG90LWFuZC1wbG90bHktYXhpcy1tYXJnaW4td29udC1jaGFuZ2UKYVtbJ3gnXV1bWydsYXlvdXQnXV1bWydhbm5vdGF0aW9ucyddXVtbMl1dW1sneCddXSAKCiNDYW1iaWFuZG8gbGEgcG9zaWNpw7NuIGRlbCAibGFiZWwiCmFbWyd4J11dW1snbGF5b3V0J11dW1snYW5ub3RhdGlvbnMnXV1bWzJdXVtbJ3gnXV0gPC0gLTAuMSAKYQpgYGAKCiMjIENvbXBhcmFjacOzbiBub21lbmNsYXR1cmFzIHBhcnRpZGFzIGFyYW5jZWxhcmlhcwoKLSBFbiBlc3RhIHRhYmxhIHNlIGNvbXBhcmFuIGxhIGRlc2NyaXBjacOzbiBkZSBsb3MgY8OzZGlnb3MgZGUgbGFzIHBhcnRpZGFzIGFyYW5jZWxhcmlhcyBwYXJhIGNhZGEgYmFzZSBkZSBkYXRvcy4KLSBMdWVnbyBkZWwgY3J1Y2Ugc2UgcHVkbyBlc3RhYmxlY2VyIHF1ZSBoYXkgYWwgbWVub3MgeHggcGFydGlkYXMgYXJhbmNlbGFyaWFzIHF1ZSB5YSBubyBlc3TDoW4gdmlnZW50ZXMsIHBlcm8gcXVlIGZpZ3VyYW4gZW4gbGEgZGF0YSBkZSB2ZXJpdHJhZGUuCi0gSGF5IHVuIGNhc28gaW50ZXJlc2FudGUgY29uIGxhIHBhcnRpZGEgIjQ0MTIzMjAwMDAiLiBEZXNkZSBlbCAyMDE4IHlhIG5vIHNlIHJlZ2lzdHJhbiBleHBvcnRhY2lvbmVzIGNvbiBlc3RlIGPDs2RpZ28uIMK/QSBxdcOpIGPDs2RpZ28gY2FtYmlhcm9uIHBhcmEgcmVnaXN0cmFyIHN1cyBleHBvcnRhY2lvbmVzPwoKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CnBhcnRpZGFzX3N1bmF0IDwtIHJlYWRfc2hlZXQoImh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFkUGQzN1dwNzJfelNuVlp0VDlkYlFpblc3ZElmd2dQYzVIWWwyRTg0RVVrL2VkaXQjZ2lkPTAiLCBzaGVldCA9ICJjb21waWxhZG8iLCBjb2xfdHlwZXMgPSAiY2NjYyIpICU+JSBkaXN0aW5jdCgpCnBhcnRpZGFzX3BhbmppdmEgPC0gcmVhZF9leGNlbChwYXRoID0gIn4vcl9wcm9qZWN0cy9jaG9tcGlyYXMvZGF0YSBwYXJ0aWRhcyBhcmFuY2VsYXJpYXMvcGFuaml2YS9QYW5qaXZhRXhwb3J0RGF0YVdvb2QueGxzeCIpCmBgYAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZXhwX21hZGVyYSAlPiUgCiAgZHBseXI6Omdyb3VwX2J5KGBQYXJ0aWRhIEFkdWFuZXJhYCwgYERlc2NyaXBjaW9uIGRlIGxhIFBhcnRpZGEgQWR1YW5lcmFgKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgdmFsb3JfZm9iID0gc3VtKGBVJCBGT0IgVG90YCxuYS5ybSA9IFQpCiAgKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBhcnJhbmdlKGRlc2ModmFsb3JfZm9iKSkgJT4lIAogIHJlbmFtZShkZXNjcmlwY2lvbl92ZXJpdHJhZGUgPSBgRGVzY3JpcGNpb24gZGUgbGEgUGFydGlkYSBBZHVhbmVyYWApICU+JSAKICBsZWZ0X2pvaW4ocGFydGlkYXNfc3VuYXQgJT4lIAogICAgICAgICAgICAgIHNlbGVjdCgtYE5ybyBQYXJ0aWRhYCwtYGRlc2NhcmdhZG8gdmVyaXRyYWRlYCkgJT4lIAogICAgICAgICAgICAgIHJlbmFtZShgUGFydGlkYSBBZHVhbmVyYWAgPSBgTnJvIFBhcnRpZGEgMmApICU+JSAKICAgICAgICAgICAgICBkaXN0aW5jdCgpLCBieSA9ICJQYXJ0aWRhIEFkdWFuZXJhIiApICU+JSAKICByZW5hbWUoZGVzY3JpcGNpb25fc3VuYXQgPSBgRGVzY3JpcGNpw7NuIGRlIFBhcnRpZGFgKSAlPiUgCiAgcmVsb2NhdGUoYFBhcnRpZGEgQWR1YW5lcmFgLGRlc2NyaXBjaW9uX3Zlcml0cmFkZSwgZGVzY3JpcGNpb25fc3VuYXQsIHZhbG9yX2ZvYikgJT4lIAogIERUOjpkYXRhdGFibGUoY29sbmFtZXMgPSBjKCJQYXJ0aWRhIGFkdWFuZXJhIiwiRGVzY3JpcGNpb24gdmVyaXRyYWRlIiwiRGVzY3JpcGNpw7NuIFN1bmF0IiwiVmFsb3IgRk9CIChVUyQpIikpICU+JSAKICBEVDo6Zm9ybWF0Um91bmQoY29sdW1ucyA9IDQ6NCAsZGlnaXRzID0gMCwgbWFyayA9ICIuIixkZWMubWFyayA9ICIsIikgCmBgYAoKCiMjIEPDs2RpZ28gcGFyYSB2ZXIgY29tcGlsYWRvIGZpbmFsIGRlIHBhcnRpZGFzIGFkdWFuZXJhcy4KYGBge3J9CmV4cF9tYWRlcmEgJT4lIAogIGRwbHlyOjpncm91cF9ieShgUGFydGlkYSBBZHVhbmVyYWAsIGBEZXNjcmlwY2lvbiBkZSBsYSBQYXJ0aWRhIEFkdWFuZXJhYCkgJT4lIAogIHN1bW1hcmlzZSgKICAgIHZhbG9yX2ZvYiA9IHN1bShgVSQgRk9CIFRvdGAsbmEucm0gPSBUKQogICkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgYXJyYW5nZShkZXNjKHZhbG9yX2ZvYikpICU+JSAKICByZW5hbWUoZGVzY3JpcGNpb25fdmVyaXRyYWRlID0gYERlc2NyaXBjaW9uIGRlIGxhIFBhcnRpZGEgQWR1YW5lcmFgKSAlPiUgCiAgbGVmdF9qb2luKHBhcnRpZGFzX3N1bmF0ICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoLWBOcm8gUGFydGlkYWAsLWBkZXNjYXJnYWRvIHZlcml0cmFkZWApICU+JSAKICAgICAgICAgICAgICByZW5hbWUoYFBhcnRpZGEgQWR1YW5lcmFgID0gYE5ybyBQYXJ0aWRhIDJgKSAlPiUgCiAgICAgICAgICAgICAgZGlzdGluY3QoKSwgYnkgPSAiUGFydGlkYSBBZHVhbmVyYSIgKSAlPiUgCiAgcmVuYW1lKGRlc2NyaXBjaW9uX3N1bmF0ID0gYERlc2NyaXBjacOzbiBkZSBQYXJ0aWRhYCkgJT4lIAogIHJlbG9jYXRlKGBQYXJ0aWRhIEFkdWFuZXJhYCxkZXNjcmlwY2lvbl92ZXJpdHJhZGUsIGRlc2NyaXBjaW9uX3N1bmF0LCB2YWxvcl9mb2IpICU+JSAKICByaWdodF9qb2luKHBhcnRpZGFzX3N1bmF0ICU+JSAKICAgICAgICAgICAgICAgcmVuYW1lKGBQYXJ0aWRhIEFkdWFuZXJhYCA9IGBOcm8gUGFydGlkYSAyYCkgJT4lIAogICAgICAgICAgICAgICBkaXN0aW5jdCgpLCBieSA9ICJQYXJ0aWRhIEFkdWFuZXJhIikgJT4lIAogIFZpZXcoKQpgYGAKCiMjIFBhcnRpZGFzIGFyYW5jZWxhcmlhcyByZWxhY2lvbmFkcyBhIFNoaWh1YWh1YWNvLgoKLSBTZWfDum4gT3NpbmZvciwgZXN0b3Mgc29uIGxvcyBub21icmVzIGNpZW50w61maWNvcyBxdWUgZXN0w6FuIHJlbGFjaW9uYWRvcyBhbCBzaGlodWFodWFjby5Db3VtYXJvdW5hIG1pY3JhbnRoYSwgQ291bWFyb3VuYSBvZG9yYXRhLCBEaXB0ZXJleCBhbGF0YW0sIERpcHRlcnl4IG1pY3JhbnRoYSwgRGlwdGVyeXggb2RvcmF0YS4gCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpleHBfbWFkZXJhICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChgRGVzY3JpcGNpb24gQ29tZXJjaWFsYCwgcmVnZXgoInNoaWh1YWh1YWNvfENvdW1hcm91bmEgbWljcmFudGhhfENvdW1hcm91bmEgb2RvcmF0YXxEaXB0ZXJleCBhbGF0YW18RGlwdGVyeXggbWljcmFudGhhfERpcHRlcnl4IG9kb3JhdGF8Y3VtYXJ1IiwgaWdub3JlX2Nhc2UgPSBUKSkpICU+JSAKICBncm91cF9ieShgUGFydGlkYSBBZHVhbmVyYWAsIGBEZXNjcmlwY2lvbiBkZSBsYSBQYXJ0aWRhIEFkdWFuZXJhYCkgJT4lIAogIHN1bW1hcmlzZSgKICAgIHZhbG9yX2ZvYiA9IHN1bShgVSQgRk9CIFRvdGAsbmEucm0gPSBUKSwKICAgIHBlc29fbmV0byA9IHN1bShgS2cgTmV0b2AsbmEucm0gPSBUKSwKICAgIG5fcmVnaXN0cm9zID0gbigpLAogICAgbl9lbXByZXNhcyA9IG5fZGlzdGluY3QoYENvZC4gVHJpYnV0YXJpb2ApLAogICAgcGFpc2VzX2Rlc3Rpbm8gPSBuX2Rpc3RpbmN0KGBQYWlzIGRlIERlc3Rpbm9gKQogICkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgbXV0YXRlKAogICAgcGVyX3ZhbG9yX2ZvYiA9IHZhbG9yX2ZvYioxMDAvc3VtKHZhbG9yX2ZvYiwgbmEucm0gPSBUKQogICkgJT4lIAogIGFycmFuZ2UoZGVzYyh2YWxvcl9mb2IpKSAlPiUgCiAgRFQ6OmRhdGF0YWJsZShjb2xuYW1lcyA9IGMoIlBhcnRpZGEgYWR1YW5lcmEiLCJQYXJ0aWRhIGFkdWFuZXJhIDIiLCJWYWxvciBGT0IgKFVTJCkiLCJQZXNvIG5ldG8gKEtnKSIsIlJlZ2lzdHJvcyIsIkVtcHJlc2FzIGV4cG9ydGFkb3JhcyIsIlBhw61zZXMgZGVzdGlubyIsIlZhbG9yIEZPQiAoJSkiKSkgJT4lIAogIERUOjpmb3JtYXRSb3VuZChjb2x1bW5zID0zOjggLGRpZ2l0cyA9IDAsIG1hcmsgPSAiLiIsZGVjLm1hcmsgPSAiLCIpIApgYGAKCiMjIEV2b2x1Y2nDs24gZGUgbGFzIHBhcnRpZGFzIGFyYW5jZWxhcmlhcyByZWxhY2lvbmFkYXMgYSBzaGlodWFodWFjbwoKIyMjIFBvciB2YWxvciBGT0IgVVMkIHsudGFic2V0fQoKIyMjIyBWaXoKCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IGV4cF9tYWRlcmEgJT4lIAogICAgICBmaWx0ZXIoc3RyX2RldGVjdChgRGVzY3JpcGNpb24gQ29tZXJjaWFsYCwgCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4KCJzaGlodWFodWFjb3xDb3VtYXJvdW5hIG1pY3JhbnRoYXxDb3VtYXJvdW5hIG9kb3JhdGF8RGlwdGVyZXggYWxhdGFtfERpcHRlcnl4IG1pY3JhbnRoYXxEaXB0ZXJ5eCBvZG9yYXRhfGN1bWFydSIsIGlnbm9yZV9jYXNlID0gVCkpKSAlPiUgCiAgICAgICAgbXV0YXRlKAogICAgICAgICAgZ3J1cG9fcGFydGlkYSA9IGNhc2Vfd2hlbigKICAgICAgICAgICAgc3RyX2RldGVjdChgUGFydGlkYSBBZHVhbmVyYWAsICJeNDQwMSIpIH4gIjQ0MDEgLSBMZcOxYSIsCiAgICAgICAgICAgIHN0cl9kZXRlY3QoYFBhcnRpZGEgQWR1YW5lcmFgLCAiXjQ0MDMiKSB+ICI0NDAzIC0gQnJ1dG8gdHJvcGljYWxlcyIsCiAgICAgICAgICAgIHN0cl9kZXRlY3QoYFBhcnRpZGEgQWR1YW5lcmFgLCAiXjQ0MDciKSB+ICI0NDA3IC0gQXNlcnJhZGEgbyBkZXNiYXN0YWRhIiwKICAgICAgICAgICAgc3RyX2RldGVjdChgUGFydGlkYSBBZHVhbmVyYWAsICJeNDQwOCIpIH4gIjQ0MDggLSBIb2phcyBjaGFwYWRvIiwKICAgICAgICAgICAgc3RyX2RldGVjdChgUGFydGlkYSBBZHVhbmVyYWAsICJeNDQwOSIpIH4gIjQ0MDkgLSBUYWJsaWxsYXMsIG1vbGR1cmFkYSwgY29uw61mZXJhcyxvdHJvcyIsCiAgICAgICAgICAgIHN0cl9kZXRlY3QoYFBhcnRpZGEgQWR1YW5lcmFgLCAiXjQ0MTAiKSB+ICI0NDEwIC0gVGFibGVyb3MiLAogICAgICAgICAgICBzdHJfZGV0ZWN0KGBQYXJ0aWRhIEFkdWFuZXJhYCwgIl40NDE4IikgfiAiNDQxOCAtIFBpZXphcyB5IG9icmFzIGNhcnBpbnRlcsOtYSIsCiAgICAgICAgICAgIHN0cl9kZXRlY3QoYFBhcnRpZGEgQWR1YW5lcmFgLCAiXjQ0MjEiKSB+ICI0NDIxIC0gRGVtw6FzIG1hbnVmYWN0dXJhIiwKICAgICAgICAgICAgc3RyX2RldGVjdChgUGFydGlkYSBBZHVhbmVyYWAsICJeOTQwMyIpIH4gIjk0MDMgLSBNdWVibGVzIgogICAgICAgICAgKQogICAgICAgICksIAogICAgICAgYWVzKHg9YW5pbywgCiAgICAgICAgICAgeT1gVSQgRk9CIFRvdGAsIAogICAgICAgICAgIGZpbGwgPSBncnVwb19wYXJ0aWRhKSkgKwogIGdlb21fY29sKCkrCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVsID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGJpZy5tYXJrID0gIi4iLGRlY2ltYWwubWFyayA9ICIsIikpCmBgYAojIyMjIFJhbmtpbmcKCmBgYHtyfQpleHBfbWFkZXJhICU+JSAKICAgICAgZmlsdGVyKHN0cl9kZXRlY3QoYERlc2NyaXBjaW9uIENvbWVyY2lhbGAsIAogICAgICAgICAgICAgICAgICAgICAgICByZWdleCgic2hpaHVhaHVhY298Q291bWFyb3VuYSBtaWNyYW50aGF8Q291bWFyb3VuYSBvZG9yYXRhfERpcHRlcmV4IGFsYXRhbXxEaXB0ZXJ5eCBtaWNyYW50aGF8RGlwdGVyeXggb2RvcmF0YXxjdW1hcnUiLCBpZ25vcmVfY2FzZSA9IFQpKSkgJT4lIAogICAgICAgIG11dGF0ZSgKICAgICAgICAgIGdydXBvX3BhcnRpZGEgPSBjYXNlX3doZW4oCiAgICAgICAgICAgIHN0cl9kZXRlY3QoYFBhcnRpZGEgQWR1YW5lcmFgLCAiXjQ0MDEiKSB+ICI0NDAxIC0gTGXDsWEiLAogICAgICAgICAgICBzdHJfZGV0ZWN0KGBQYXJ0aWRhIEFkdWFuZXJhYCwgIl40NDAzIikgfiAiNDQwMyAtIEJydXRvIHRyb3BpY2FsZXMiLAogICAgICAgICAgICBzdHJfZGV0ZWN0KGBQYXJ0aWRhIEFkdWFuZXJhYCwgIl40NDA3IikgfiAiNDQwNyAtIEFzZXJyYWRhIG8gZGVzYmFzdGFkYSIsCiAgICAgICAgICAgIHN0cl9kZXRlY3QoYFBhcnRpZGEgQWR1YW5lcmFgLCAiXjQ0MDgiKSB+ICI0NDA4IC0gSG9qYXMgY2hhcGFkbyIsCiAgICAgICAgICAgIHN0cl9kZXRlY3QoYFBhcnRpZGEgQWR1YW5lcmFgLCAiXjQ0MDkiKSB+ICI0NDA5IC0gVGFibGlsbGFzLCBtb2xkdXJhZGEsIGNvbsOtZmVyYXMsb3Ryb3MiLAogICAgICAgICAgICBzdHJfZGV0ZWN0KGBQYXJ0aWRhIEFkdWFuZXJhYCwgIl40NDEwIikgfiAiNDQxMCAtIFRhYmxlcm9zIiwKICAgICAgICAgICAgc3RyX2RldGVjdChgUGFydGlkYSBBZHVhbmVyYWAsICJeNDQxOCIpIH4gIjQ0MTggLSBQaWV6YXMgeSBvYnJhcyBjYXJwaW50ZXLDrWEiLAogICAgICAgICAgICBzdHJfZGV0ZWN0KGBQYXJ0aWRhIEFkdWFuZXJhYCwgIl40NDIxIikgfiAiNDQyMSAtIERlbcOhcyBtYW51ZmFjdHVyYSIsCiAgICAgICAgICAgIHN0cl9kZXRlY3QoYFBhcnRpZGEgQWR1YW5lcmFgLCAiXjk0MDMiKSB+ICI5NDAzIC0gTXVlYmxlcyIKICAgICAgICAgICkKICAgICAgICApICU+JSAKICBncm91cF9ieShncnVwb19wYXJ0aWRhKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgdmFsb3JfZm9iID0gc3VtKGBVJCBGT0IgVG90YCxuYS5ybSA9IFQpLAogICAgcGVzb19uZXRvID0gc3VtKGBLZyBOZXRvYCxuYS5ybSA9IFQpLAogICAgbl9yZWdpc3Ryb3MgPSBuKCksCiAgICBuX2VtcHJlc2FzID0gbl9kaXN0aW5jdChgQ29kLiBUcmlidXRhcmlvYCksCiAgICBwYWlzZXNfZGVzdGlubyA9IG5fZGlzdGluY3QoYFBhaXMgZGUgRGVzdGlub2ApCiAgKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBtdXRhdGUoCiAgICBwZXJfdmFsb3JfZm9iID0gdmFsb3JfZm9iKjEwMC9zdW0odmFsb3JfZm9iLCBuYS5ybSA9IFQpCiAgKSAlPiUgCiAgYXJyYW5nZShkZXNjKHZhbG9yX2ZvYikpICU+JSAKICBEVDo6ZGF0YXRhYmxlKGNvbG5hbWVzID0gYygiR3J1cG8gcGFydGlkYSIsIlZhbG9yIEZPQiAoVVMkKSIsIlBlc28gbmV0byAoS2cpIiwiUmVnaXN0cm9zIiwiRW1wcmVzYXMgZXhwb3J0YWRvcmFzIiwiUGHDrXNlcyBkZXN0aW5vIiwiVmFsb3IgRk9CICglKSIpKSAlPiUgCiAgRFQ6OmZvcm1hdFJvdW5kKGNvbHVtbnMgPTI6NyAsZGlnaXRzID0gMCwgbWFyayA9ICIuIixkZWMubWFyayA9ICIsIikgCgoKYGBgCgojIyMgUG9yIHBlc28gTmV0byBLRwpgYGB7cn0KZ2dwbG90KGRhdGEgPSBleHBfbWFkZXJhICU+JSAKICAgICAgZmlsdGVyKHN0cl9kZXRlY3QoYERlc2NyaXBjaW9uIENvbWVyY2lhbGAsIAogICAgICAgICAgICAgICAgICAgICAgICByZWdleCgic2hpaHVhaHVhY298Q291bWFyb3VuYSBtaWNyYW50aGF8Q291bWFyb3VuYSBvZG9yYXRhfERpcHRlcmV4IGFsYXRhbXxEaXB0ZXJ5eCBtaWNyYW50aGF8RGlwdGVyeXggb2RvcmF0YXxjdW1hcnUiLCBpZ25vcmVfY2FzZSA9IFQpKSkgJT4lIAogICAgICAgIG11dGF0ZSgKICAgICAgICAgIGdydXBvX3BhcnRpZGEgPSBjYXNlX3doZW4oCiAgICAgICAgICAgIHN0cl9kZXRlY3QoYFBhcnRpZGEgQWR1YW5lcmFgLCAiXjQ0MDEiKSB+ICI0NDAxIC0gTGXDsWEiLAogICAgICAgICAgICBzdHJfZGV0ZWN0KGBQYXJ0aWRhIEFkdWFuZXJhYCwgIl40NDAzIikgfiAiNDQwMyAtIEJydXRvIHRyb3BpY2FsZXMiLAogICAgICAgICAgICBzdHJfZGV0ZWN0KGBQYXJ0aWRhIEFkdWFuZXJhYCwgIl40NDA3IikgfiAiNDQwNyAtIEFzZXJyYWRhIG8gZGVzYmFzdGFkYSIsCiAgICAgICAgICAgIHN0cl9kZXRlY3QoYFBhcnRpZGEgQWR1YW5lcmFgLCAiXjQ0MDgiKSB+ICI0NDA4IC0gSG9qYXMgY2hhcGFkbyIsCiAgICAgICAgICAgIHN0cl9kZXRlY3QoYFBhcnRpZGEgQWR1YW5lcmFgLCAiXjQ0MDkiKSB+ICI0NDA5IC0gVGFibGlsbGFzLCBtb2xkdXJhZGEsIGNvbsOtZmVyYXMsb3Ryb3MiLAogICAgICAgICAgICBzdHJfZGV0ZWN0KGBQYXJ0aWRhIEFkdWFuZXJhYCwgIl40NDEwIikgfiAiNDQxMCAtIFRhYmxlcm9zIiwKICAgICAgICAgICAgc3RyX2RldGVjdChgUGFydGlkYSBBZHVhbmVyYWAsICJeNDQxOCIpIH4gIjQ0MTggLSBQaWV6YXMgeSBvYnJhcyBjYXJwaW50ZXLDrWEiLAogICAgICAgICAgICBzdHJfZGV0ZWN0KGBQYXJ0aWRhIEFkdWFuZXJhYCwgIl40NDIxIikgfiAiNDQyMSAtIERlbcOhcyBtYW51ZmFjdHVyYSIsCiAgICAgICAgICAgIHN0cl9kZXRlY3QoYFBhcnRpZGEgQWR1YW5lcmFgLCAiXjk0MDMiKSB+ICI5NDAzIC0gTXVlYmxlcyIKICAgICAgICAgICkKICAgICAgICApLCAKICAgICAgIGFlcyh4PWFuaW8sIAogICAgICAgICAgIHk9YEtnIE5ldG9gLCAKICAgICAgICAgICBmaWxsID0gZ3J1cG9fcGFydGlkYSkpICsKICBnZW9tX2NvbCgpKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbCA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChiaWcubWFyayA9ICIuIixkZWNpbWFsLm1hcmsgPSAiLCIpKQpgYGAKCiMjIFNoaWh1YWh1YWNvIGZyZW50ZSBhIHRvZGFzIGxhcyBleHBvcnRhY2lvbmVzIGRlIG1hZGVyYQoKLSBFbiByb2pvOiBleHBvcnRhY2lvbmVzIGRlIHNoaWh1YWh1YWNvCi0gRW4gZ3JpczogZXhwb3J0YWNpb25lcyB0b3RhbGVzCgojIyMgUG9yIHZhbG9yIEZPQiBVUyQKYGBge3J9CmdncGxvdCgpKwogIGdlb21fY29sKGRhdGEgPSBleHBfbWFkZXJhLCBhZXMoeD1hbmlvLCB5ID0gYFUkIEZPQiBUb3RgKSkrCiAgZ2VvbV9jb2woZGF0YSA9IGV4cF9tYWRlcmEgJT4lIAogICAgICAgICAgICBmaWx0ZXIoc3RyX2RldGVjdChgRGVzY3JpcGNpb24gQ29tZXJjaWFsYCwgCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4KCJzaGlodWFodWFjb3xDb3VtYXJvdW5hIG1pY3JhbnRoYXxDb3VtYXJvdW5hIG9kb3JhdGF8RGlwdGVyZXggYWxhdGFtfERpcHRlcnl4IG1pY3JhbnRoYXxEaXB0ZXJ5eCBvZG9yYXRhfGN1bWFydSIsIGlnbm9yZV9jYXNlID0gVCkpKQogICAgICAgICAgICwgYWVzKHg9YW5pbywgeSA9IGBVJCBGT0IgVG90YCksIGZpbGwgPSAicmVkIikrCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVsID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGJpZy5tYXJrID0gIi4iLGRlY2ltYWwubWFyayA9ICIsIikpCmBgYAoKIyMjIFBvciBwZXNvIE5ldG8gS0cKYGBge3J9CmdncGxvdCgpKwogIGdlb21fY29sKGRhdGEgPSBleHBfbWFkZXJhLCBhZXMoeD1hbmlvLCB5ID0gYEtnIE5ldG9gKSkrCiAgZ2VvbV9jb2woZGF0YSA9IGV4cF9tYWRlcmEgJT4lIAogICAgICAgICAgICBmaWx0ZXIoc3RyX2RldGVjdChgRGVzY3JpcGNpb24gQ29tZXJjaWFsYCwgCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4KCJzaGlodWFodWFjb3xDb3VtYXJvdW5hIG1pY3JhbnRoYXxDb3VtYXJvdW5hIG9kb3JhdGF8RGlwdGVyZXggYWxhdGFtfERpcHRlcnl4IG1pY3JhbnRoYXxEaXB0ZXJ5eCBvZG9yYXRhfGN1bWFydSIsIGlnbm9yZV9jYXNlID0gVCkpKQogICAgICAgICAgICwgYWVzKHg9YW5pbywgeSA9IGBLZyBOZXRvYCksIGZpbGwgPSAicmVkIikrCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVsID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGJpZy5tYXJrID0gIi4iLGRlY2ltYWwubWFyayA9ICIsIikpCmBgYAoKIyMgUXXDqSBlbXByZXNhcyBoYW4gZXhwb3J0YWRvIG3DoXMgU2hpaHVhaHVhY28KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZXhwX21hZGVyYSAlPiUgCiAgZmlsdGVyKHN0cl9kZXRlY3QoYERlc2NyaXBjaW9uIENvbWVyY2lhbGAsIHJlZ2V4KCJzaGlodWFodWFjb3xDb3VtYXJvdW5hIG1pY3JhbnRoYXxDb3VtYXJvdW5hIG9kb3JhdGF8RGlwdGVyZXggYWxhdGFtfERpcHRlcnl4IG1pY3JhbnRoYXxEaXB0ZXJ5eCBvZG9yYXRhfGN1bWFydSIsIGlnbm9yZV9jYXNlID0gVCkpKSAlPiUgCiAgZ3JvdXBfYnkoRXhwb3J0YWRvcikgJT4lIAogIHN1bW1hcmlzZSgKICAgIHZhbG9yX2ZvYiA9IHN1bShgVSQgRk9CIFRvdGAsbmEucm0gPSBUKSwKICAgIHBlc29fbmV0byA9IHN1bShgS2cgTmV0b2AsbmEucm0gPSBUKSwKICAgIG5fcmVnaXN0cm9zID0gbigpLAogICAgbl9lbXByZXNhcyA9IG5fZGlzdGluY3QoYENvZC4gVHJpYnV0YXJpb2ApLAogICAgcGFpc2VzX2Rlc3Rpbm8gPSBuX2Rpc3RpbmN0KGBQYWlzIGRlIERlc3Rpbm9gKQogICkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgbXV0YXRlKAogICAgcGVyX3ZhbG9yX2ZvYiA9IHZhbG9yX2ZvYioxMDAvc3VtKHZhbG9yX2ZvYiwgbmEucm0gPSBUKQogICkgJT4lIAogIGFycmFuZ2UoZGVzYyh2YWxvcl9mb2IpKSAlPiUgCiAgRFQ6OmRhdGF0YWJsZShjb2xuYW1lcyA9IGMoIkV4cG9ydGFkb3IiLCJWYWxvciBGT0IgKFVTJCkiLCJQZXNvIG5ldG8gKEtnKSIsIlJlZ2lzdHJvcyIsIkVtcHJlc2FzIGV4cG9ydGFkb3JhcyIsIlBhw61zZXMgZGVzdGlubyIsIlZhbG9yIEZPQiAoJSkiKSkgJT4lIAogIERUOjpmb3JtYXRSb3VuZChjb2x1bW5zID0yOjcgLGRpZ2l0cyA9IDAsIG1hcmsgPSAiLiIsZGVjLm1hcmsgPSAiLCIpIApgYGAKIyMgUXXDqSBwYcOtc2VzIGhhbiByZWNpYmlkbyBtw6FzIFNoaWh1YWh1YWNvIGRlc2RlIFBlcsO6CgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpleHBfbWFkZXJhICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChgRGVzY3JpcGNpb24gQ29tZXJjaWFsYCwgcmVnZXgoInNoaWh1YWh1YWNvfENvdW1hcm91bmEgbWljcmFudGhhfENvdW1hcm91bmEgb2RvcmF0YXxEaXB0ZXJleCBhbGF0YW18RGlwdGVyeXggbWljcmFudGhhfERpcHRlcnl4IG9kb3JhdGF8Y3VtYXJ1IiwgaWdub3JlX2Nhc2UgPSBUKSkpICU+JSAKICBncm91cF9ieShgUGFpcyBkZSBEZXN0aW5vYCkgJT4lIAogIHN1bW1hcmlzZSgKICAgIHZhbG9yX2ZvYiA9IHN1bShgVSQgRk9CIFRvdGAsbmEucm0gPSBUKSwKICAgIHBlc29fbmV0byA9IHN1bShgS2cgTmV0b2AsbmEucm0gPSBUKSwKICAgIG5fcmVnaXN0cm9zID0gbigpLAogICAgbl9lbXByZXNhcyA9IG5fZGlzdGluY3QoYENvZC4gVHJpYnV0YXJpb2ApLAogICAgcGFpc2VzX2Rlc3Rpbm8gPSBuX2Rpc3RpbmN0KGBQYWlzIGRlIERlc3Rpbm9gKQogICkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgbXV0YXRlKAogICAgcGVyX3ZhbG9yX2ZvYiA9IHZhbG9yX2ZvYioxMDAvc3VtKHZhbG9yX2ZvYiwgbmEucm0gPSBUKQogICkgJT4lIAogIGFycmFuZ2UoZGVzYyh2YWxvcl9mb2IpKSAlPiUgCiAgRFQ6OmRhdGF0YWJsZShjb2xuYW1lcyA9IGMoIlBhw61zIGRlc3Rpbm8iLCJWYWxvciBGT0IgKFVTJCkiLCJQZXNvIG5ldG8gKEtnKSIsIlJlZ2lzdHJvcyIsIkVtcHJlc2FzIGV4cG9ydGFkb3JhcyIsIlBhw61zZXMgZGVzdGlubyIsIlZhbG9yIEZPQiAoJSkiKSkgJT4lIAogIERUOjpmb3JtYXRSb3VuZChjb2x1bW5zID0yOjcgLGRpZ2l0cyA9IDAsIG1hcmsgPSAiLiIsZGVjLm1hcmsgPSAiLCIpIApgYGAKCg==